<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>构造器的继承</title>
</head>
<body>
<script>

  /*
  * 子类若没有继承父类的构造器的话那么访问子类中不存在的属性其实会找到父类
  *
  * */
    function User1(){
      this.a = 'A'
    }

    function  Boy(){

    }

    Boy.prototype = new User1()
    Boy.prototype.constructor = Boy

    let boy = new Boy()
    console.log(boy.a);
    console.log(boy);


  console.log("---------");


/*
* 但是很多时候子类继承父类的话也会继承父类的构造函数
* 比如使用class创建对象的话子类的构造函数中首行必须使用super调用父类的构造
* 既然调用了父类的构造的话那么父类的属性会被定义在子类身上，也就是说子类元素其实访问父类中继承的属性不会沿着原型去父类身上找，而是自身就有了
* 其实想想的话也应该是这样，因为父类中的没有赋值
*
* 而且使用子类的构造函数传入参数创建对象，也是给子类的身上赋值而不会去操作父类
*
* */
  function User2(){
    this.a = 'A'
  }

  function  Boy1(){
     User2.call(this)
  }

  Boy1.prototype = new User2()
  Boy1.prototype.constructor = Boy1

  let boy1 = new Boy1()
  console.log(boy1.a);
  console.log(boy1);


  /*
  * 总结: 子类访问一个自身不存在但是定义在父类上的方法是会沿着原型找到的，子类访问的属性都是自己身上的，不是从父类身上找到的
  * 因为子类中调用了父类构造为自身的属性赋值
  * */

  class  User{
    constructor(b) {
      this.a = 'A'
      this.b =b
    }
  }

  class Girl extends User{
    constructor(b,c) {
      super(b);
      this.c =c
    }
  }

  let girl = new Girl('B','C')
  console.log(girl);



</script>
</body>
</html>